﻿/**	@file		lxnet_itf.h
 *	@date		(2011-04-20 00:45:41)/(2014-12-14 00:51:59)
 *-----------------------------------------------------------------------------
 *	@version	1.0.2.2
 *	@author		Nick Shallery	(nicknide@gmail.com)
 *	@copyright	YOU HAVE ALL LEFT WITH THIS CODE WHILE YOU KEEP COMMENT IN EVERY COPY.
 *-----------------------------------------------------------------------------
**/

#if			!defined(__LOLIX__LXNET__LXNET_ITF__H__NICK__K_IN_G__)
#define		__LOLIX__LXNET__LXNET_ITF__H__NICK__K_IN_G__

#if			!defined(__LOLIX__LOLI__FILE__H__K_IN_G__)
	#include	"../lolix/loli/file.h"
#endif	//	!defined(__LOLIX__LOLI__FILE__H__K_IN_G__)

namespace lxio{
	class file_async_pool;
}


namespace lxnet{
class net_listen;
class net_connect;

class LOLIX_NO_VTABLE net_factory
	: public lolix::itf
{
public:
	LOLIX_DECLARE_ITF(lxnet::net_factory, lolix::itf, (0x5aeefc71, 0x23ab4b47, 0x804aae2a, 0x4885b721));
	LOLIX_INTERFACE(query_connect	, LOLIX_RETNV	, (net_connect** out_ptr, const wchar_t* conn_name, size_type name_len, lolix::loli::file::open_flag of, lxio::file_async_pool*));
	LOLIX_INTERFACE(query_listen	, LOLIX_RETNV	, (net_listen** out_ptr, const wchar_t* bind_name, size_type name_len, lxio::file_async_pool*));
};

}


/**
 *	\class net_listen
 *
 *	\brief	网络监听对象
**/
class LOLIX_NO_VTABLE lxnet::net_listen
	: public lolix::loli::file_tree
{
public:
	LOLIX_DECLARE_ITF(lxnet::net_listen, lolix::loli::file_tree, (0x3d6df4fa, 0x5fbf8048, 0x84b48d00, 0xf68244a0));
	/**
	 *	\brief	当监听到新的连接时回调此函数
	 *	\param	net_conn	新联入的指针
	 *	\param	usr_ptr		对象注册回调时候的用户指针
	**/
	typedef void (LOLIX_CALL *FN_OnConn)(net_connect* net_conn, void* usr_ptr);

	/**
	 *	\brief	当监听到有连接断开时回调此函数
	 *	\param	net_conn	新断开的指针
	 *	\param	usr_ptr		对象注册回调时候的用户指针
	**/
	typedef void (LOLIX_CALL *FN_OnDisc)(net_connect* net_conn, void* usrPtr);

	/**
	 *	\fn LOLIX_RETNV net_listen::close(void);
	 *
	 *	\brief 关闭当前的监听
	 *
	 *	\return 是否成功关闭
	**/
	LOLIX_INTERFACE(close	, LOLIX_RETNV, (void));

	/**
	 *	\fn LOLIX_RETNV net_listen::on_conn(FN_OnConn on_conn, void* usr_ptr, FN_OnConn* old_on_conn, void** old_usr_ptr);
	 *
	 *	\brief 设定连接入之后的回调函数
	 *
	 *	\param on_conn	连接的回调函数
	 *
	 *	\param usr_ptr	连接回调时传入的指针
	 *
	 *	\param [out] old_on_conn	当前所包含的回调，为空则表示不关心当前的状态
	 *
	 *	\param [out] old_usr_ptr	当前所包含的回调时回传的指针，为空则表示不关心当前的状态
	 *
	 *	\return	返回是否成功
	**/
	LOLIX_INTERFACE(on_conn	, LOLIX_RETNV, (FN_OnConn on_conn, void* usr_ptr, FN_OnConn* old_on_conn, void** old_usr_ptr));

	/**
	 *	\fn LOLIX_RETNV net_listen::on_disc(FN_OnConn on_conn, void* usr_ptr, FN_OnConn* old_on_conn, void** old_usr_ptr);
	 *
	 *	\brief 设定断开连接之后的回调函数
	 *
	 *	\param on_disc	断开连接时的回调函数
	 *
	 *	\param usr_ptr	断开连接回调时传入的指针
	 *
	 *	\param [out] old_on_disc	当前所包含的回调，为空则表示不关心当前的状态
	 *
	 *	\param [out] old_usr_ptr	当前所包含的回调时回传的指针，为空则表示不关心当前的状态
	 *
	 *	\return	返回是否成功
	**/
	LOLIX_INTERFACE(on_disc	, LOLIX_RETNV, (FN_OnDisc on_disc, void* usr_ptr, FN_OnDisc* old_on_disc, void** old_usr_ptr));
};

LOLIX_DEFINE_ID_INTERFACE_FROM_SPECIFIC_TYPE(lxnet::net_connect, lolix::loli::file, (0xe11640a9, 0x4203f645, 0x96ec1e4b, 0x0332b21c));

#endif	//	!defined(__LOLIX__LXNET__LXNET_ITF__H__NICK__K_IN_G__)
